<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Random access machine</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Random_access_machine"> <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Random_access_machine rootpage-Random_access_machine skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Random access machine</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr">
<p>En <a href="Informatique_th%C3%A9orique" title="Informatique théorique">informatique théorique</a>, la <b>machine RAM</b>, pour <i>Random Access Machine</i>, est un modèle abstrait d'ordinateur destiné à étudier des <a href="Algorithmique" title="Algorithmique">algorithmes</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Ordinateur">Ordinateur</h2></div>
<p><span class="need_ref" title="Ce passage semble être une interprétation personnelle ou un travail inédit." style="cursor:help;">Notre ordinateur est</span><sup class="need_ref_tag" style="padding-left:2px;">[Interprétation personnelle ?]</sup> une machine qui ne fait qu'effectuer des calculs sur des nombres, codés sous la forme d'une suite de symboles. Ces calculs vont donc transformer une suite de symboles en une autre. Les suites de symboles manipulées sont appelées des <b>données</b>, tandis que les calculs qui transforment une chaîne de « caractères » en une autre sont appelées des <b>instructions</b>.
</p><p>Un ordinateur, quel qu'il soit, ne fait qu'exécuter une suite d'instructions dans un ordre bien précis sur des données. La suite d'instructions à exécuter s'appelle un <b>programme</b>.
</p><p>Dans nos ordinateurs actuels, ces symboles sont des 0 ou des 1 : notre ordinateur utilise la numération binaire.
</p>
<div class="mw-heading mw-heading2"><h2 id="Architecture_d'une_machine_RAM"><span id="Architecture_d.27une_machine_RAM"></span>Architecture d'une machine RAM</h2></div>
<p>La machine RAM est un ordinateur composé :
</p>
<ul><li>d'<b>une unité de calcul</b>, qui va effectuer des instructions ;</li>
<li>une <b>mémoire</b>, à savoir quelque chose capable de retenir des données, pour pouvoir les stocker et les récupérer. Cette mémoire est découpée en deux sous-mémoires :
<ul><li>une mémoire programme, qui stocke les instructions du programme à effectuer dans l'ordre dans lequel elles doivent être calculées ;</li>
<li>une <a href="M%C3%A9moire_de_travail" title="Mémoire de travail">mémoire de travail</a>, qui stocke les données (variables) que va manipuler le programme ;</li></ul></li>
<li>de <b>registres</b>, de petites mémoires ultra-rapides capables de stocker temporairement une donnée ;</li>
<li>d'une <b>bande de sortie</b>, un morceau de papier sur lequel notre machine RAM va écrire le résultat du programme exécuté ;</li>
<li>une <b>bande d'entrée</b> sur laquelle est inscrit l'ensemble des données initiales nécessaires à l'exécution du programme, qui va être lue par notre machine RAM ;</li>
<li>et d'un <b>bus de communication</b> qui va permettre la <a href="Transmission_de_donn%C3%A9es" title="Transmission de données">transmission de données</a> ou d'instructions entre les différents composants de la machine.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Mémoire_RAM"><span id="M.C3.A9moire_RAM"></span>Mémoire RAM</h2></div>
<p>La mémoire d'un ordinateur sert à stocker le programme à exécuter et ses données. On peut accéder à la mémoire de deux façons :
</p>
<ul><li>en <b>écriture</b> : on stocke une donnée dans la mémoire ;</li>
<li>en <b>lecture</b> : on récupère une donnée/instruction de la mémoire.</li></ul>
<p>La mémoire de la machine RAM possède quelques particularités.
</p><p>Cette mémoire est découpée en cases mémoires. Chacune de ces cases mémoire peut stocker un nombre, sous la forme d'une suite de symboles.
</p><p>Notre machine RAM a besoin de pouvoir sélectionner une case mémoire parmi toutes les autres afin d'accéder à son contenu et uniquement à son contenu. Pour cela, on attribue à chaque case mémoire un identifiant, nommé son <b>adresse mémoire</b>. Cette adresse est un nombre, attribué de façon unique à une case mémoire : deux cases mémoires auront deux adresses mémoires différentes. On dit que la mémoire est <b>adressable</b>. On peut donc accéder à une donnée dans la mémoire sans avoir besoin de lire toutes les données précédentes (<a href="Acc%C3%A8s_s%C3%A9quentiel" title="Accès séquentiel">accès séquentiel</a>).
</p><p>Enfin, il faut savoir que le temps mis pour lire (récupérer) ou écrire (modifier) le contenu d'une case mémoire est le même pour toutes les cases mémoires. Il n'y en a pas une plus lente que l'autre.
</p><p>La mémoire est donc :
</p>
<ul><li>découpée en cases mémoires ;</li>
<li>adressable ;</li>
<li>à temps d'accès constant quelle que soit la case mémoire sélectionnée.</li></ul>
<p>Une mémoire de ce type est appelée en électronique une mémoire RAM (<i>Random Access Memory</i>).
</p>
<div class="mw-heading mw-heading2"><h2 id="Registres">Registres</h2></div>
<p>Un <b>registre</b> est une petite mémoire interne à un processeur qui va permettre de stocker un nombre, représenté sous la forme d'une suite de symboles. Dans les ordinateurs actuels ces registres stockent des suites de 0 et de 1, nos ordinateurs utilisant la représentation binaire. Cette suite de symbole représente un « nombre ».
</p><p>Notre machine RAM possède donc des registres. Parmi ces registres, certains ont une utilité particulière.
</p>
<div class="mw-heading mw-heading3"><h3 id="Le_compteur_d'instruction"><span id="Le_compteur_d.27instruction"></span>Le compteur d'instruction</h3></div>
<p>Pour rappel, un ordinateur doit effectuer une suite d'instructions dans un ordre bien précis. En prenant un programme ayant un nombre fini n d'instructions, on peut donc numéroter chaque instruction du programme par un nombre bien précis, de 1 à n. La dernière instruction étant une instruction STOP, qui arrête le fonctionnement de la machine RAM.
</p><p>Le <b>compteur d'instruction</b> stocke ce nombre attribué à chaque instruction.
</p><p>À la fin de chaque instruction, ce compteur est automatiquement augmenté de 1 (on dit aussi incrémenté) : cela permet de passer à l'instruction suivante.
</p><p>Dans nos ordinateurs actuels il y a de légères différences :
</p>
<ul><li>les instructions sont toujours stockées dans la mémoire, mais elles ne sont pas numérotées. Le compteur d'instruction stocke alors l'adresse de l'instruction en mémoire ;</li>
<li>les instructions peuvent prendre plusieurs cases mémoire. Le compteur n'est donc pas augmenté de 1 à chaque fois, mais d'un nombre représentant le nombre de cases mémoires occupées par l'instruction.</li></ul>
<div class="mw-heading mw-heading3"><h3 id="L'accumulateur"><span id="L.27accumulateur"></span>L'accumulateur</h3></div>
<p>Ce registre peut contenir une copie d'une donnée présente dans la mémoire RAM. C'est sur la donnée présente dans cet accumulateur que le processeur va effectuer des instructions. Mais le processeur peut aussi aller chercher des données supplémentaires en RAM, en plus de la donnée présente dans l'accumulateur.
</p>
<div class="mw-heading mw-heading2"><h2 id="Instructions">Instructions</h2></div>
<p>On l'a vu, notre machine RAM a un processeur qui exécute des instructions. Ces instructions peuvent être des additions, des multiplications, par exemple, mais qui peuvent aussi faire des choses un peu plus utiles. Parmi ces instructions, on peut citer certaines instructions présentes chez toutes les machines RAM :
</p>
<pre> * LOAD
* STORE
* JUMP
*…
</pre>
<div class="mw-heading mw-heading2"><h2 id="Instructions_arithmétiques"><span id="Instructions_arithm.C3.A9tiques"></span>Instructions arithmétiques</h2></div>
<p>Ces instructions font simplement des calculs sur des nombres. On peut citer par exemple :
</p>
<pre> * addition,
* multiplication,
* division,
* modulo,
* soustraction,
* racine carrée,
* cosinus,
*…
</pre>
<div class="mw-heading mw-heading2"><h2 id="Les_instructions_logiques">Les instructions logiques</h2></div>
<p>Elles travaillent sur des bits.
</p>
<pre> * ET,
* OU,
* XOR,
* NON.
</pre>
<div class="mw-heading mw-heading2"><h2 id="Instructions_LOAD_et_STORE">Instructions LOAD et STORE</h2></div>
<p>LOAD permet de copier une donnée présente en mémoire dans un registre.
</p><p>STORE permet de copier une donnée contenue dans un registre dans la mémoire RAM.
</p>
<div class="mw-heading mw-heading2"><h2 id="Instructions_de_rupture_de_séquence"><span id="Instructions_de_rupture_de_s.C3.A9quence"></span>Instructions de rupture de séquence</h2></div>
<p>Ces instructions sont appelées des branchements.
</p><p>Elles permettent de sauter directement à une instruction autre que l'instruction immédiatement suivante et poursuivre l'exécution à partir de cette instruction. Cela permet au programme de passer directement à une instruction située plus loin dans le déroulement normal du programme, voire de revenir à une instruction antérieure.
</p><p>Pour ce faire, elles modifient le contenu du registre pointeur d'instruction, et y place l'adresse de l'instruction à laquelle on veut sauter.
</p><p>Les branchements permettent de ne pas respecter d'ordre d'exécution des instructions.
</p><p>Par exemple, supposons qu'une machine RAM en soit à l'instruction numéro 5. Si cette instruction est une instruction de rupture de séquence, alors la machine RAM passera directement, par exemple, à l'instruction numéro 60 au lieu de l'instruction 6.
</p>
<div class="mw-heading mw-heading2"><h2 id="Les_instructions_de_test">Les instructions de test</h2></div>
<p>Ces instructions permettent de vérifier si une proposition est valide ou pas.
</p><p>Les plus courantes sont :
</p>
<pre> * Test d'égalité : vérifie si deux nombres sont égaux.
* Test de supériorité : teste si un nombre est supérieur à un autre.
* Test d'infériorité : teste si un nombre est inférieur à un autre.
* Test de différence : teste si deux nombres a et b sont différents.
</pre>
<p>Ces instructions se marient très bien avec les instructions de rupture de séquence, comme on le verra plus tard.
</p>
<div class="mw-heading mw-heading3"><h3 id="Instructions_READ_et_WRITE">Instructions READ et WRITE</h3></div>
<p>Ces instructions permettent d'écrire une donnée sur les bandes d'entrées (pour READ) et de sortie (pour WRITE). Cela permet de représenter de manière ultra-simplifiée la communication avec les <a href="Entr%C3%A9es-sorties" class="mw-redirect" title="Entrées-sorties">entrées-sorties</a>.
</p><p>Dans la réalité, la communication avec une entrée ou une sortie est bien plus compliquée qu'une simple instruction !
</p>
<div class="mw-heading mw-heading2"><h2 id="Différences_et_ressemblances_avec_un_ordinateur_actuel"><span id="Diff.C3.A9rences_et_ressemblances_avec_un_ordinateur_actuel"></span>Différences et ressemblances avec un ordinateur actuel</h2></div>
<p>La machine RAM ressemble beaucoup aux ordinateurs actuels, mais s'en différencie par certains points.
</p><p>Les ordinateurs actuels, tout comme les machines RAM, possèdent les ressemblances suivantes avec la machine RAM :
</p>
<ul><li>la présence de registres ;</li>
<li>la mémoire de travail est une mémoire RAM.</li></ul>
<p>Dans un ordinateur, rien n'empêche d'utiliser une mémoire dont le temps d'accès est très dépendant de l'emplacement de la donnée dans la mémoire, comme un <a href="Disque_dur" title="Disque dur">disque dur</a>. Mais tous les ordinateurs actuels utilisent une mémoire RAM, pour des raisons techniques.
</p><p>Mais il existe des différences avec un ordinateur réel. Dans la machine RAM, les entrées-sorties sont modélisées par des bandes sur lesquelles on écrit un nombre en binaire.
</p><p>Nonobstant ces différences, nos ordinateurs actuels sont le plus souvent des machines RAM améliorées sur certains points, auxquelles on a rajouté quelques subtilités, comme une pile ou un cache. Ce sont donc des machines RAM. Mais il existe des ordinateurs qui ne sont pas des machines RAM améliorées, ni même des machines RAM tout court ! Les premiers ordinateurs n'étaient pas des machines dotées d'une mémoire RAM, et fonctionnaient avec des mémoires bien différentes.
</p>
<div class="mw-heading mw-heading3"><h3 id="Articles_connexes">Articles connexes</h3></div>
<ul><li><a href="Parallel_random_access_machine" title="Parallel random access machine">Parallel random access machine</a></li>
<li><a rel="nofollow" class="external text" href="http://zanotti.univ-tln.fr/RAM/ram.php">Simulateur de machine RAM</a></li></ul>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer skin-invert-image" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de l'informatique théorique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2024-06-12" href="https://fr.wikipedia.org/wiki/?title=Random_access_machine&oldid=215896199">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>